package com.dy.cloud.controller;

import com.dy.cloud.service.OrderHystrixService;
import com.dy.cloud.util.ApiResousUtil;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @ClassName:
 * @Author: 仄言in
 * @Desctiption: (描述)
 * @Date: 2021/9/15 17:11
 * @Version 1.0 (版本)
 */
@RestController
@RequestMapping("/hystrix")
@DefaultProperties(defaultFallback = "payment_All_timoutHandler")
//@DefaultProperties(defaultFallback = "payment_All_timoutHandler"):Hystrix,统一降级方法，当我们没有指定的降级方法时，就会执行统一的降级处理。
public class OrderHystrixController {
    @Resource
    private OrderHystrixService orderHystrixService;
    @Value("${server.port}")
    private String port;
    /**
     * 正常访问
     * @return
     */
    @GetMapping("/ok/{id}")
    public ApiResousUtil payment_ok(@PathVariable("id") Integer id){
        return ApiResousUtil.ok(orderHystrixService.payment_ok(id)+"port"+port);
    }

    /**
     * 延时访问，当需要有指定降级方法时，可以指定指出哪个降级方法
     * 当不指定时，只需要注解@HystrixCommand即可，这时就会默认走统一降级方法
     * @return
     */
    @GetMapping("/timout/{id}")
    /**
    @HystrixCommand(fallbackMethod = "payment_timoutHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "6000")
    })
     **/
    @HystrixCommand
    public ApiResousUtil payment_timout(@PathVariable("id") Integer id){
        return ApiResousUtil.ok(orderHystrixService.payment_timout(id)+"port"+port);
    }
    /**
     * 全查询
     * @return ApiResousUtil
     **/
    @GetMapping("/list")
    public ApiResousUtil list(){
        return ApiResousUtil.ok(orderHystrixService.list()+"port"+port);
    }
    /**
     * 指定的降级处理方法
     * @param id
     * @return
     **/
    public ApiResousUtil payment_timoutHandler(@PathVariable("id") Integer id){
        return ApiResousUtil.ok("我是Feign的Hystrix降级处理方法,当前服务器访繁忙或内部资源错误， hi✿(。◕ᴗ◕。)✿ ");
    }

    /**
     * 统一的降级方法，当降级没有指定方法时，就走统一的降级方法，这时候需要在有可能降级的方法上加上注解@HystrixCommand
     * @return
     */
    public ApiResousUtil payment_All_timoutHandler(){
        return ApiResousUtil.ok("我是Feign的Hystrix的统一降级处理方法,当前服务器访繁忙或内部资源错误， (。◕ᴗ◕。)✿ ");
    }
}
